﻿Public Class ConexionSGS

    ''' <summary>
    ''' Funcion que devuelve la cadena de conexión con la contraseña oculta
    ''' </summary>
    ''' <param name="conexionCompleta">Corresponde a la cadena de conexión</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function ObtenerCadenaDeConexionConContrasenaOculta(ByRef conexionCompleta As String) As String

        Try
            Dim inicio As Integer = InStr(conexionCompleta, "ord=")
            Dim final As Integer = InStr(conexionCompleta, ";Hos")
            Dim cadena1 As String = ""
            cadena1 = Mid(conexionCompleta, 1, inicio + 3)
            'Dim cadena2 As String = "***************"
            'cadena2 = Mid(Conexion.Text, inicio, final - inicio)
            Dim cadena3 As String = ""
            cadena3 = Mid(conexionCompleta, final, Len(conexionCompleta))
            Dim CadenaSinContrasena As String = String.Format("{0}***************{1}", cadena1, cadena3)
            Return CadenaSinContrasena
        Catch ex As Exception
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgVinicio, "Error en la función ObtenerCadenaDeConexionConContrasenaOculta de la clase ConexionSGS", ex, My.Resources.StringGlobal.mdlGeneral, "ConexionSGS", "ObtenerCadenaDeConexionConContrasenaOculta")
            Return "Problemas al visualizar la cadena de conexión"
        End Try
    End Function

    ''' <summary>
    ''' Función que indica si hay conexión al servidor de base de datos, retorna true si existe la conexión de lo contrario retorna falso
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function HayConexionConElServidor() As Boolean
        Using conexion As New Devart.Data.PostgreSql.PgSqlConnection(ObtenerCadenaDeConexion())
            Try
                conexion.Open()
            Catch ex As Exception
                LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgVinicio, "Error en la función HayConexionConElServidor de la clase ConexionSGS", ex, My.Resources.StringGlobal.mdlGeneral, "ConexionSGS", "HayConexionConElServidor")
                Return False
         End Try
        End Using
        Return True
    End Function

    ''' <summary>
    ''' Funcion que obtiene la cadena de conexión del archivo de configuracion
    ''' </summary>
    ''' <returns>Retorna la cadena de conexión del archivo de configuración</returns>
    ''' <remarks></remarks>
    Public Shared Function ObtenerCadenaDeConexion() As String
        Dim nombreArchivo As String = My.Resources.ConexionSGS.archivoConfiguaracion
        Dim directorioActual As String = System.IO.Directory.GetCurrentDirectory()
        Dim DireccionArchivo As String = String.Format("{0}\{1}", directorioActual, nombreArchivo)
        Dim CadenaDeConexion As String = ""
        Try
            Dim streamReader As New System.IO.StreamReader(DireccionArchivo)
            CadenaDeConexion = streamReader.ReadToEnd()
            streamReader.Close()
        Catch ex As Exception
            LogSGS.RegistrarLogYEnviarCorreo(My.Resources.StringGlobal.prgVinicio, "Error en la función ObtenerCadenaDeConexion de la clase ConexionSGS", ex, My.Resources.StringGlobal.mdlGeneral, "ConexionSGS", "ObtenerCadenaDeConexion")
            Return CadenaDeConexion
        End Try
        Return CadenaDeConexion
    End Function

    ''' <summary>
    ''' Retorna un único valor (por ejemplo, un sum, count.) desde la base de datos
    ''' </summary>
    ''' <param name="query">Corresponde a la instrucción SQL a ajecutar</param>
    ''' <returns>Retorna un único valor como resultado a la instrucción SQL o "" de encontrar un error</returns>
    ''' <remarks></remarks>
    Public Shared Function EjecutarQueryScalar(ByVal query As String) As Object
        Dim resultado As Object = ""
        Dim cadenaDeConexion As String = ObtenerCadenaDeConexion()
        'Try
        Using conexionSQL As New Devart.Data.PostgreSql.PgSqlConnection(cadenaDeConexion)
            conexionSQL.Open()
            Using comandoSQL As New Devart.Data.PostgreSql.PgSqlCommand(query, conexionSQL)
                resultado = comandoSQL.ExecuteScalar
            End Using
            conexionSQL.Close()
        End Using
        'Catch ex As Exception
        'LogSGS.RegistrarLogYEnviarCorreo(My.Resources.StringGlobal.prgVinicio, "Error en la función EjecutarQueryScalar de la clase ConexionSGS", ex, My.Resources.StringGlobal.mdlGeneral, "ConexionSGS", "EjecutarQueryScalar")
        ' Return resultado
        'End Try
        Return resultado
    End Function

    ''' <summary>
    ''' Ejecuta comandos SQL como INSERT, DELETE, UPDATE.
    ''' </summary>
    ''' <param name="query">Corresponde a la instrucción SQL a ajecutar</param>
    ''' <returns>Retorna true si se ejecuto la instruccion SQL sin problemas, de lo contrario devuelve false</returns>
    ''' <remarks></remarks>
    Public Shared Function EjecutarQueryNonQuery(ByVal query As String) As Boolean
        Dim cadenaDeConexion As String = ObtenerCadenaDeConexion()
        ' Try
        Using conexionSQL As New Devart.Data.PostgreSql.PgSqlConnection(cadenaDeConexion)
            conexionSQL.Open()
            Using comandoSQL As New Devart.Data.PostgreSql.PgSqlCommand(query, conexionSQL)
                comandoSQL.ExecuteNonQuery()
            End Using
            conexionSQL.Close()
        End Using
        ' Catch ex As Exception
        ' LogSGS.RegistrarLogYEnviarCorreo(My.Resources.StringGlobal.prgVinicio, "Error en la función EjecutarQueryNonQuery de la clase ConexionSGS", ex, My.Resources.StringGlobal.mdlGeneral, "ConexionSGS", "EjecutarQueryNonQuery")
        ' Return False
        'End Try
        Return True
    End Function

    ''' <summary>
    ''' Ejecuta comandos que devuelven filas.
    ''' </summary>
    ''' <param name="query">Corresponde a la instrucción SQL a ajecutar</param>
    ''' <returns>Retorna la(s) fila(s) de la instrucción SQL o "" de encontrar un error</returns>
    ''' <remarks></remarks>
    Public Shared Function EjecutarQueryReader(ByVal query As String) As Object
        Dim resultado As Object = ""
        Dim cadenaDeConexion As String = ObtenerCadenaDeConexion()
        Try
            Using conexionSQL As New Devart.Data.PostgreSql.PgSqlConnection(cadenaDeConexion)
                conexionSQL.Open()
                Using comandoSQL As New Devart.Data.PostgreSql.PgSqlCommand(query, conexionSQL)
                    resultado = comandoSQL.ExecuteReader
                End Using
                conexionSQL.Close()
            End Using
        Catch ex As Exception
            LogSGS.RegistrarLogYEnviarCorreo(My.Resources.StringGlobal.prgVinicio, "Error en la función EjecutarQueryReader de la clase ConexionSGS", ex, My.Resources.StringGlobal.mdlGeneral, "ConexionSGS", "EjecutarQueryReader")
            Return resultado
        End Try
        Return resultado
    End Function

    ''' <summary>
    ''' Devuelve un subconjunto específico de filas cuando pagina a travez de los resultados de una consulta.
    ''' </summary>
    ''' <param name="query">Corresponde a la instrucción SQL a ajecutar</param>
    ''' <param name="comportamiento">Corresonde al comportamiento de la instrucción SQL (System.Data.CommandBehavior)</param>
    ''' <param name="inicioRegistro">Corresponde al valor de inicio del conjunto de resultado</param>
    ''' <param name="registroMaximo">Corresponde al maximo o limite del cunjunto del resultado</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function EjecutarQueryPageReader(ByVal query As String, ByVal comportamiento As System.Data.CommandBehavior, ByVal inicioRegistro As Integer, ByVal registroMaximo As Integer) As Object
        Dim resultado As Object = ""
        Dim cadenaDeConexion As String = ObtenerCadenaDeConexion()
        Try
            Using conexionSQL As New Devart.Data.PostgreSql.PgSqlConnection(cadenaDeConexion)
                conexionSQL.Open()
                Using comandoSQL As New Devart.Data.PostgreSql.PgSqlCommand(query, conexionSQL)
                    resultado = comandoSQL.ExecutePageReader(comportamiento, inicioRegistro, registroMaximo)
                End Using
                conexionSQL.Close()
            End Using
        Catch ex As Exception
            LogSGS.RegistrarLogYEnviarCorreo(My.Resources.StringGlobal.prgVinicio, "Error en la función EjecutarQueryPageReader de la clase ConexionSGS", ex, My.Resources.StringGlobal.mdlGeneral, "ConexionSGS", "EjecutarQueryPageReader")
            Return resultado
        End Try
        Return resultado
    End Function

End Class
